/*
 * ComponenteBase.java
 *
 * Copyright 2011 Universidad Francisco de Paula Santander (UFPS).
 * Todos los Derechos Reservados.
 * Creado el 21/03/2011, 05:30:11 PM
 */

package com.ufps.cuatro.util.base;

import java.util.ArrayList;

import com.ufps.cuatro.modelo.representacion.Inicializacion;

/**
 * <i><b>ComponenteBase:</b></i>Esta Clase abstracta es la Base para creación de los
 * elementos gráficos en la representación de los modelos analizados.
 * @author Carlos A. Torres C. - Dolly E. Guerrero. <https://code.google.com/p/tesis4dor/>
 * @version 1.0 21/03/2011
 * @see ObjectBase
 */
public abstract class ComponenteBase extends ObjectBase{
    private static final long serialVersionUID = -2282777083425772153L;
    
    private static int serialComponenteBase;
    private int idClaseComponenteBase;        
    
    /**
     * Esta Cadena representa el Alias del Componente Base el cual será utilizado para
     * describir de una forma amigable el control swing que representa.
     */
    protected String strAlias;
    /**
     * Esta cadena visualiza un mensaje de ayuda que describe el Componente Base.
     */
    protected String strToolTips;
    /**
     * Esta Propiedad permite establecer si el Componente necesita de un modelo asociado
     * para represetnar la correcta interación en la interfaz gráfica uqe se incluirá.
     * Un Modelo Asociado es la representación de un Tipo de dato del modelo analizado,
     * esto quiere decir que un Modelo Asociado es un <code>ComponenteGenerador</code>.
     * 
     */
    protected boolean permiteModeloAsociado = false;
    /**
     * Indica si el Componente inicializa por defecto algunas de sus propiedades ó
     * de sus Componentes Generados.
     */
    protected boolean inicializacion = false;
    /**
     * Contiene las Propiedades inicializadas del Componente o de sus Componentes Generados
     * en caso de que aplique (<code>inicializacion = true</code>).
     */
    protected ArrayList<Inicializacion> objInicializaciones;
    /**
     * Indica el Modo de Representación del Control en la Interfaz. El Modo
     * de Representación determina si el Control se utiliza por Defecto para operaciones
     * de entrada, salida ó ambas. Sin embargo el usuario puede cambiar esta recomendación
     * al generar sus Componentes.
     */
    protected int modo;
    
    /**
     * Constructor por Defecto.
     */
    public ComponenteBase() {
        super();        
        this.idClaseComponenteBase = ComponenteBase.serialComponenteBase++;
    }    
    
    /**
     * Constructor Utilizado por la Implementación.
     * @param id Id de Generación del Objeto.
     */
    public ComponenteBase(int id) {
        super(id);        
        this.idClaseComponenteBase = ComponenteBase.serialComponenteBase++;
    }
        
    /**
     * Devuelve el Alias de Visualización para el Componente.
     * @return Alias de Visualización para el Componente Base.
     */
    public String getStrAlias() {
        return strAlias;
    }

    /**
     * Establece el Alias de Visualización para el Componente Base.
     * @param strAlias Alias de Visualización para el Componente Base.
     */
    public void setStrAlias(String strAlias) {
        this.strAlias = strAlias;
    }
    
    /**
     * Devuelve el Mensaje de Ayuda Informativo para el Componente Base.
     * @return Mensaje de Ayuda Informativo para el Componente Base.
     */
    public String getStrTooltips() {
        return strToolTips;
    }

    /**
     * Establece el Mensaje de Ayuda Informativo para el Componente Base.
     * @param strToolTips Mensaje de Ayuda Informativo para el Componente Base.
     */
    public void setStrTooltips(String strToolTips) {
        this.strToolTips = strToolTips;
    }

    /**
     * Devuelve el estado que indica que el Componente requiere un 
     * Modelo asociado para su representación en la interfaz gráfica.
     * @return boolean que determina el estado de la Propiedad.
     */
    public boolean isPermiteModeloAsociado() {
        return permiteModeloAsociado;
    }

    /**
     * Establece el estado que indica que el Componente requiere un 
     * Modelo asociado para su representación en la interfaz gráfica.
     * @param permiteModeloAsociado boolean que determina el estado de la Propiedad.
     */
    public void setPermiteModeloAsociado(boolean permiteModeloAsociado) {
        this.permiteModeloAsociado = permiteModeloAsociado;
    }    
    
    /**
     * Devuelve el indice de generación de la clase.
     * @return Indice de generación de la clase.
     */
    public int getIdClaseComponenteBase() {
       try{
         return idClaseComponenteBase;
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }   
    
    /**
     * Devuelve el estado que indica si el Componente Inicializa propiedades.
     * @return indica estado que indica si el Componente Inicializa propiedades.
     */
    public boolean isInicializacion() {
        return inicializacion;
    }

    /**
     * Establece el estado que indica si el Componente Inicializa propiedades.
     * @param inicializacion estado que indica si el Componente Inicializa propiedades.
     */
    public void setInicializacion(boolean inicializacion) {
        this.inicializacion = inicializacion;
    }    

    /**
     * Devuelve la Colección de Inicializaciones para este Componente y sus Componentes
     * Generados.
     * @return Colección de Inicializaciones para este Componente y sus Componentes
     * Generados.
     */
    public ArrayList<Inicializacion> getObjInicializaciones() {
        return objInicializaciones;
    }

    /**
     * Estabelce la Colección de Inicializaciones para este Componente y sus Componentes
     * Generados.
     * @param objInicializaciones Colección de Inicializaciones para este Componente y sus Componentes
     * Generados.
     */
    public void setObjInicializaciones(ArrayList<Inicializacion> objInicializaciones) {
        this.objInicializaciones = objInicializaciones;
    }
    
    @Override
    public String toString() {        
        return this.strAlias;
    }        

    @Override
    public int compareTo(Object o) {
       try{ 
            ComponenteBase obj = (ComponenteBase) o;
            if(this.idClaseComponenteBase > obj.idClaseComponenteBase) {
                return 1;
            }
            else if(this.idClaseComponenteBase < obj.idClaseComponenteBase) {
                return -1;
            }
            else {
                return 0;
            }
        }catch(java.lang.NullPointerException ex){}
       return 0;
    }

}
